package version2024.medium;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author sunhl
 * @Description: HJ43 迷宫问题 递归, DFS
 * @Date: created in 2024/12/31 星期二 10:08
 * @Modified By:
 */
public class HJ43_MazeProblem {
    public static void main(String[] args) {
        //输入：
        //5 5
        //0 1 0 0 0
        //0 1 1 1 0
        //0 0 0 0 0
        //0 1 1 1 0
        //0 0 0 1 0
        // 注意数组上下是x轴(对应宽), 左右是y轴(对应高), 和通常的认知不同

        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            // 获取迷宫的行
            int h = in.nextInt();
            // 获取迷宫的列
            int w = in.nextInt();
            // 构建迷宫数组
            int[][] map = new int[h][w];
            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    map[i][j] = in.nextInt();
                }
            }

            List<Pos> path = new ArrayList<>();
            // DFS 搜索路径
            dfs(map, 0, 0, path);

            for (Pos p : path) {
                System.out.println("(" + p.x + "," + p.y + ")");
            }

        }
    }

    // 返回值, 标记是否找到可通行的路径
    public static boolean dfs(int[][] map, int x, int y, List<Pos> path) {
        // 添加路径并标记已走
        path.add(new Pos(x, y));
        map[x][y] = 1;

        // 结束标志, 已经走到迷宫出口
        if (x == map.length - 1 && y == map[0].length - 1) {
            return true;
        }

        // 向右能走时
        if (x + 1 < map.length && map[x + 1][y] == 0) {
            if (dfs(map, x + 1, y, path)) {
                return true;
            }
        }
        // 向上能走时
        if (y + 1 < map[0].length && map[x][y + 1] == 0) {
            if (dfs(map, x, y + 1, path)) {
                return true;
            }
        }
        // 向左能走时
        if (x - 1 > -1 && map[x - 1][y] == 0) {
            if (dfs(map, x - 1, y, path)) {
                return true;
            }
        }
        // 向下能走时
        if (y - 1 > -1 && map[x][y - 1] == 0) {
            if (dfs(map, x, y - 1, path)) {
                return true;
            }
        }

        // 走到不可走的点, 回溯
        path.remove(path.size() - 1);
        map[x][y] = 0;

        return false;
    }

    // 位置类
    public static class Pos {
        int x;
        int y;

        public Pos(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
